package main

import (
	"GoCrontab/crontab/worker"
	"flag"
	"fmt"
	"runtime"
	"time"
)

// golang基于协程的多线程。协程建立在线程上，且golang的协程会被调度在线程上，
//多核优势必须与cpu核心数量相等
//这里已经是单独的目录，所以包名必须是main，要不然main函数也启动不了

//如果用goland启动worker，仍然会提示open ./worker.json: The system cannot find the file specified因为默认设置的工作目录为gopath目录，需要在ide的run/debug editConfiguration上配置一下,working directory 设置为F:\GitClone\GoCrontab\crontab\worker\main包下即可
func initEnv() {
	//初始化线程数，设置与cpu数量相等
	runtime.GOMAXPROCS(runtime.NumCPU())
}

var (
	configFile string
)

//初始化命令行参数
func initCommandLineArgs() {
	// worker -config ./worker.json
	// worker -h
	flag.StringVar(&configFile, "-config", "./worker.json", "-config ./your.json")

	flag.Parse()
	fmt.Println("解析命令行完成")
	//file, _ := exec.LookPath(os.Args[0])
	//fmt.Println("当前执行路径为 ",file)
}

//
// 任务管理，拉取任务列表
//jobManager->WatchJobs(PushJobEvent) ->              				->			jobResult[save delete kill]-channel -> goroutine
//|
// 任务执行，推送执行结果
//Exectutor->ExecuteJobevent（PushJobResult）			--> Scheduler Loop ->  	jobExec-channel -> goroutine
//|            			|

func main() {

	var (
		err error
	)

	//解析当前配置文件，（worker.json的配置）
	initCommandLineArgs()

	//初始化环境||目前只是配置线程数量
	initEnv()

	//加载服务启动配置，从worker.json中读到结GlobalConfig构体中
	if err = worker.InitConfig(configFile); err != nil {
		goto ERR
	}

	//worker的服务注册，针对keepOnline，向前端展示健康节点
	if err = worker.InitRegister(); err != nil {
		goto ERR
	}

	//启动watch之前先得把,调度准备好，chan准备好,
	//这里有个问题，怎么把各个层级的chan 返回的error做正常的捕捉的？
	if err = worker.InitScheduler(); err != nil {
		return
	}

	//启动worker管理，主要etcd服务连接配置）
	if err = worker.InitJobManager(); err != nil {
		goto ERR
	}

	//这步没啥意义
	if err = worker.InitExecutor(); err != nil {
		goto ERR
	}
	//日志协程启动
	if err = worker.InitLogSink(); err != nil {
		goto ERR
	}
	////启动worker的watch
	if err = worker.GlobalJobManager.WatchJobs(); err != nil {
		goto ERR
	}

	for {
		time.Sleep(1 * time.Second)
	}

	//return

ERR:

	fmt.Println(err)
	//启动http service
}
